package com.wqh.ice.demo;

import com.wqh.ice.service.HelloServicePrx;
import com.zeroc.Ice.Communicator;
import com.zeroc.Ice.ObjectPrx;
import com.zeroc.Ice.Util;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;

public class Client {
    private static Logger logger = Logger.getLogger(Client.class.getSimpleName());

    public static void main(String[] args) {

        List<String> exgas= new ArrayList<>();
        int status=0;
        logger.info("客户端启动.........");
        try(Communicator com = Util.initialize(args,"config.client",exgas)){

            //初始化通信器
            Communicator ic = Util.initialize(args);


            Runtime.getRuntime().addShutdownHook(new Thread(() -> com.destroy()));

            if(!exgas.isEmpty()){
                System.err.println("too many arguments");
                status = 1;
            }else {
                status= run(com);
            }
        }
        System.exit(status);
//        // 根据地址生成一个服务代理对象
//        // HelloIce -- 服务端那边自己定义的名字
//        ObjectPrx proxy = ic.stringToProxy("HelloIce:default -h 192.168.10.1 -p 1888");
//        // 转换成HelloService类型的代理服务
//        HelloServicePrx helloPrx = HelloServicePrx.checkedCast(proxy);
//        //调用服务器端的方法sy
//        String s = helloPrx.sayHello("The World");
//        System.out.println(">>"+s);
    }

    private static int run(Communicator communicator) {
        ObjectPrx proxy = communicator.propertyToProxy("Hello.Proxy");
        /*使用二次代理返回代理相同的代理，true则只有使用安全传输的端点是由新代理使用。
        如果为false，则返回的代理同时使用安全和不安全的端点。*/
        HelloServicePrx twoway =
                HelloServicePrx.checkedCast(proxy).ice_twoway().ice_secure(false);

        if (twoway == null) {
            System.err.println("invalid proxy");
            return 1;
        }
        //使用单向调用的代理。
        HelloServicePrx oneway = twoway.ice_oneway();
        //使用批处理单向调用。
        HelloServicePrx batchOneway = twoway.ice_batchOneway();
        //使用数据报调用。
        HelloServicePrx datagram = twoway.ice_datagram();
        //使用批处理的数据报调用
        HelloServicePrx batchDatagram = twoway.ice_batchDatagram();

        boolean secure = false;
        int timeout=-1,delay=0;

        menu();

        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

        String line = null;
        do {
            try {
                System.out.print("==> ");
                System.out.flush();
                line = in.readLine();
                if (line == null) {
                    break;
                }
                if (line.equals("t")) {
                    twoway.sayHello(delay+"");
                } else if (line.equals("o")) {
                    oneway.sayHello(delay+"");
                } else if (line.equals("bo")) {
                    batchOneway.sayHello(delay+"");
                } else if (line.equals("d")) {
                   datagram.sayHello(delay+"");
                } else if (line.equals("bd")) {
                    batchDatagram.sayHello(delay+"");
                } else if (line.equals("?")) {
                    menu();
                } else {
                    System.out.println("unknown command `" + line + "'");
                    menu();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        while (!line.equals("x"));

        return 0;
    }

    private static void menu() {
        System.out.println(
                "usage:\n" +
                        "t: 开启双向通行\n" +
                        "o: 开启单向通行\n" +
                        "bo: 开启批量单向通行\n" +
                        "d: 开启数据报通信\n" +
                        "bd: 开启批量数据报通信\n" +
                        "x: exit\n" +
                        "?: help\n");
    }

}
